{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1605\n"
     ]
    }
   ],
   "source": [
    "#从文件导入停用词表\n",
    "def stop_words(path):\n",
    "    stpwrd_dic = open(path, 'r')\n",
    "    stpwrd_content = stpwrd_dic.read()\n",
    "    stpwrd_dic.close()\n",
    "    return stpwrd_content.splitlines()#将停用词表转换为list  \n",
    "\n",
    "#合并搜集到的2份停用词表\n",
    "stop_words=list(set(stop_words(\"stop_words.txt\")+stop_words('chineseStopWords.txt')))\n",
    "print(len(stop_words))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>2</th>\n",
       "      <th>合晟资产是一家专注于股票、债券等二级市场投资，为合格投资者提供专业资产管理服务的企业。公司业务范围包括资产管理、投资咨询和投资顾问服务。公司管理的私募基金产品主要包括股票型、债券型资产管理计划或证券投资基金，管理总资产规模80亿元左右。根据中国证券投资基金业协会数据，公司管理的私募证券投资基金（顾问管理）类规模较大，公司管理规模处于50亿元以上的第一梯队。</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>2</td>\n",
       "      <td>公司的主营业务为向中小微企业、个体工商户、农户等客户提供贷款服务，自设立以来主营业务未发生过变化。</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1</td>\n",
       "      <td>公司立足于商业地产服务，致力于为商业地产开发、销售、运营全产业链提供一整套增值服务，业务覆盖...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>2</td>\n",
       "      <td>公司经工商管理部门核准的经营范围为“投资咨询、经济信息咨询，企业管理咨询，品牌推广策划，公共...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>2</td>\n",
       "      <td>该公司的主营业务为在中国境内(港、澳、台除外)开展保险代理销售，依托于自身的产品研究能力和专...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>1</td>\n",
       "      <td>公司主营业务为地铁商业物业的租赁与运营管理服务。公司以整体租赁的方式取得轨道交通站点附属建筑...</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   2  \\\n",
       "0  2   \n",
       "1  1   \n",
       "2  2   \n",
       "3  2   \n",
       "4  1   \n",
       "\n",
       "  合晟资产是一家专注于股票、债券等二级市场投资，为合格投资者提供专业资产管理服务的企业。公司业务范围包括资产管理、投资咨询和投资顾问服务。公司管理的私募基金产品主要包括股票型、债券型资产管理计划或证券投资基金，管理总资产规模80亿元左右。根据中国证券投资基金业协会数据，公司管理的私募证券投资基金（顾问管理）类规模较大，公司管理规模处于50亿元以上的第一梯队。  \n",
       "0  公司的主营业务为向中小微企业、个体工商户、农户等客户提供贷款服务，自设立以来主营业务未发生过变化。                                                                                                                                   \n",
       "1  公司立足于商业地产服务，致力于为商业地产开发、销售、运营全产业链提供一整套增值服务，业务覆盖...                                                                                                                                   \n",
       "2  公司经工商管理部门核准的经营范围为“投资咨询、经济信息咨询，企业管理咨询，品牌推广策划，公共...                                                                                                                                   \n",
       "3  该公司的主营业务为在中国境内(港、澳、台除外)开展保险代理销售，依托于自身的产品研究能力和专...                                                                                                                                   \n",
       "4  公司主营业务为地铁商业物业的租赁与运营管理服务。公司以整体租赁的方式取得轨道交通站点附属建筑...                                                                                                                                   "
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import pandas as pd\n",
    "\n",
    "#导入训练集\n",
    "\n",
    "train = pd.read_csv(\"training.csv\")\n",
    "train.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "1. 分词:由于企业描述是文本信息，需要对文本信息进行特征提取。文本分词可采用Jieba分词"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Building prefix dict from /home/chenxiangkong/.local/lib/python3.6/site-packages/jieba/dict.txt ...\n",
      "Dumping model to file cache /tmp/jieba.cache\n",
      "Loading model cost 4.394130229949951 seconds.\n",
      "Prefix dict has been built succesfully.\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "0       公司 的 主营业务 为 向 中小 微 企业 、 个体 工商户 、 农户 等 客户 提供 贷款...\n",
       "1       公司 立足于 商业地产 服务 ， 致力于 为 商业地产 开发 、 销售 、 运营 全 产业链...\n",
       "2       公司 经 工商管理 部门 核准 的 经营范围 为 “ 投资 咨询 、 经济 信息 咨询 ， ...\n",
       "3       该 公司 的 主营业务 为 在 中国 境内 ( 港 、 澳 、 台 除外 ) 开展 保险代理...\n",
       "4       公司 主营业务 为 地铁 商业 物业 的 租赁 与 运营 管理 服务 。 公司 以 整体 租...\n",
       "5       作为 位于 南京市 江宁区 的 小额 信贷 融资 服务供应商 ， 公司 专注 于 满足 当地...\n",
       "6       公司 主要 为 商业 地产商 提供 服务 ， 主要 内容 为 项目前期 的 市场调研 ， 项...\n",
       "7       青岛 拥湾 资产 管理 集团股份 有限公司 ( 简称 “ 拥湾 资产 ” ， 股票代码 83...\n",
       "8       公司 的 主营业务 为 提供 物业管理 服务 ， 公司 自 成立 以来 主营业务 未 发生变...\n",
       "9       公司 提供 的 主要 服务 包括 ： 物业管理 ； 家政 服务 ； 洗染 服务 ； 建筑 清...\n",
       "10      根据 《 上市公司 行业 分类 指引 》 （ 2012 年 修订 ） ， 公司 所属 行业 ...\n",
       "11      公司 是 一家 从事 房地产 营销 的 顾问 代理 机构 ， 是 浙江 宁波 、 舟山 两地...\n",
       "12      公司 专业 从事 高档 写字楼 、 住宅 、 政府 机关 大楼 等 中高档 物业 项目 的 ...\n",
       "13      公司 主要 为 房地产 开发商 提供 传统 营销 代理服务 、 顾问 策划 服务 以及 基于...\n",
       "14      公司 以 平台 信息 服务 和 房屋交易 中介 服务 为 支点 ， 业务 覆盖 信息 咨询服...\n",
       "15      公司 系 一家 专注 于 供应链 体系 中 物流 与 生产 两大 产业 ， 以 保险 产品代...\n",
       "16      公司 主要 从事 私募 股权 投资 基金 管理 和 自有 资金 直接 股权 投资 ， 以及 ...\n",
       "17      公司 成立 于 2012 年 1 月 ， 注册资金 2.5 亿 ， 是 由 扬州 广电集团 ...\n",
       "18      公司 以 私募 股权 投资 基金 管理 为 主营业务 ， 系 国内 领先 的 专注 于 消费...\n",
       "19      公司 是 一家 在 商办 物业 领域 具备 从 咨询 顾问 、 物业管理 到 工商 物业 运...\n",
       "20      公司 是 一家 专注 于 从事 保险产品 的 代理 销售 的 专业 保险代理 公司 。 自 ...\n",
       "21      经 工商登记 机关 核准 ， 本 公司 的 经营范围 包括 ： 面向 “ 三农 ” 发放贷款...\n",
       "22      公司 是 一家 主要 涉及 新房 代理 销售 、 二手房 中介 品牌 特许加盟 及 运营 管...\n",
       "23      根据 大连市 金融 发展局 批复 ， 经 工商登记 机关 核准 ， 公司 的 经营范围 及 ...\n",
       "24      浏阳市 通源 小额贷款 有限公司 ， 是 经 浏阳 市政府 招标 ， 经 湖南省人民政府 金...\n",
       "25      公司 是 按照 人民银行 、 银监会 有关 规定 设立 ， 经 山东省政府 金融 办 审批 ...\n",
       "26      公司 的 主营业务 为 私募 股权 投资 基金 管理 业务 以及 股权 投资 业务 。 公司...\n",
       "27      公司 作为 投资 型 孵化器 机构 ， 是 天使 投资 行业 的 延伸 ， 经营 模式 为 ...\n",
       "28      根据 中国证监会 《 上市公司 行业 分类 指引 》 （ 2012 年 修订 ） 的 规定 ...\n",
       "29      经 证监会 批准 ， 公司 的 经营范围 为 证券 经纪 ； 证券 投资 咨询 ； 与 证券...\n",
       "                              ...                        \n",
       "4743    公司 经营范围 为 ： 高低压 开关 成套设备 ， 无功 控制 及 补偿 系统 ， 配电 自...\n",
       "4744    公司 主要 从事 建筑 智能化 及 相关 工程 的 技术 服务 ， 公司 2014 年 建筑...\n",
       "4745    公司 主营业务 是 中药饮片 生产 与 销售 ， 隶属于 中药饮片 加工 行业 。 公司 零...\n",
       "4746    公司 是 一家 专业 致力于 企业 信息化 建设 与 服务 , 以 软件 研发 、 销售 及...\n",
       "4747    公司 经 工商部门 核准 的 经营范围 为 ： 自动化 控制 的 软 、 硬件 开发 、 销...\n",
       "4748    公司 主要 业务 包括 园林绿化 施工 、 园林绿化 养护 和 绿化 苗木 培育 等 。 公...\n",
       "4749    公司 主营业务 主要 包括 四大 业务 板块 ， 分别 为 园林绿化 工程 及 养护 、 园...\n",
       "4750    公司 是 一家 专业 从事 影视作品 后期制作 、 影视 器材 设备 租赁 以及 影视剧 投...\n",
       "4751    公司 成立 开始 ， 是 一家 专门从事 进口 铁矿石 现货 贸易 的 贸易商 ， 业务 主...\n",
       "4752    公司 专注 于 医疗 信息化 领域 的 软件系统 开发 、 技术 咨询服务 、 系统集成 、...\n",
       "4753    公司 是 一家 集 科研开发 、 生产 、 销售 与 服务 为 一体 的 现代化 动物 药品...\n",
       "4754    公司 以 构建 中国 “ 互联网 + ” 创意 产业 服务 众包 生态圈 为 使命 , 致力...\n",
       "4755    公司 是 一家 集 电梯 部件 研发 、 生产 和 销售 为 一体 的 电梯 部件 制造 企...\n",
       "4756    公司 是 一家 专业 提供 无纸化 会议 系统 解决方案 的 公司 ， 主要 从事 无纸化 ...\n",
       "4757    公司 经 工商部门 核准 的 经营范围 为 ： 机器人 及 自动化 装备 、 AGV 、 传...\n",
       "4758    公司 主营业务 为 热处理 设备 的 设计 、 研发 、 生产 和 销售 及 相关 设备 配...\n",
       "4759    公司 自 成立 以来 致力于 园林绿化 事业 ， 主要 从事 园林工程 施工 、 苗木 种植...\n",
       "4760    本 公司 自 成立 以来 ， 一直 专注 于 以 前沿 的 软件开发 与 实施 技术 ， 向...\n",
       "4761    公司 主要 产品 为 塑料 中空板 产品 ， 包括 中空板 周转箱 类 、 包装箱 类 、 ...\n",
       "4762    泰克 贝思自 成立 以来 一致 专注 于 数字 出版 领域 ， 主要 服务 于 出版物 供应...\n",
       "4763    公司 作为 工业 机器人 系统 整体 解决方案 的 提供商 ， 为 汽车 及 零部件 、 工...\n",
       "4764    公司 经 工商部门 核准 的 经营范围 为 ： 生产 和 销售 汽车 门板 饰条 、 仪表板...\n",
       "4765    公司 主营业务 为 网站 开发技术 服务 ， 同时 ， 公司 在 网站 开发技术 服务 过程...\n",
       "4766    公司 经 工商部门 核准 的 经营范围 为 ： “ 抗震 产品 、 综合 支 吊架 、 检测...\n",
       "4767    公司 作为 一家 以 整合营销 传播 见长 的 专业 公关 公司 ， 依托 多年 的 公关 ...\n",
       "4768    公司 的 主营业务 为 药品 的 研发 ， 制造 和 销售 。 根据 《 上市公司 行业 分...\n",
       "4769    医疗器械 的 经销 业务 为 经销 锐珂 公司 的 医用 干式 胶片 产品 。 北京市卫生局...\n",
       "4770    公司 以 绿色 、 环保 为 经营 理念 ， 主要 从事 汽车 美容 养护 产品 的 研发 ...\n",
       "4771    公司 致力于 引进 和 研发 国际 先进 的 基因 检测 分析 技术 , 在 此基础 上 开...\n",
       "4772    公司 主营业务 为 提供 第三方 工程 安全 风险管理 咨询服务 。 在 整合 安全工程 、...\n",
       "Name: 合晟资产是一家专注于股票、债券等二级市场投资，为合格投资者提供专业资产管理服务的企业。公司业务范围包括资产管理、投资咨询和投资顾问服务。公司管理的私募基金产品主要包括股票型、债券型资产管理计划或证券投资基金，管理总资产规模80亿元左右。根据中国证券投资基金业协会数据，公司管理的私募证券投资基金（顾问管理）类规模较大，公司管理规模处于50亿元以上的第一梯队。, Length: 4773, dtype: object"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import jieba\n",
    "\n",
    "X=train.iloc[:,1].apply(lambda sentence:' '.join(jieba.cut(sentence)))\n",
    "X"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "2. 特征提取： 去掉停用词后（stop_words），采用TFIDF作为每个文本的特征描述。 "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<4773x30731 sparse matrix of type '<class 'numpy.float64'>'\n",
       "\twith 318768 stored elements in Compressed Sparse Row format>"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.feature_extraction.text import TfidfVectorizer\n",
    "\n",
    "vector = TfidfVectorizer(stop_words=stop_words)\n",
    "tfidf = vector.fit_transform(X)\n",
    "tfidf"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "11"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#原本类中的类别个数\n",
    "\n",
    "labels_true=train.iloc[:,0]\n",
    "cluster_num=len(set(labels_true))\n",
    "cluster_num"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "3. 采用KMeans聚类算法，选择合适的度量指标，选择最佳的K"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "K-means begin with clusters: 5\n",
      "K-means end with clusters: 5\n",
      "v_measure_score: 0.18012421978613397\n",
      "calinski_harabaz_score: 32.6129398753987\n",
      "silhouette_score: 0.008610600571064273\n",
      "K-means begin with clusters: 10\n",
      "K-means end with clusters: 10\n",
      "v_measure_score: 0.28389748539904297\n",
      "calinski_harabaz_score: 23.388780554894478\n",
      "silhouette_score: 0.011759804353165901\n",
      "K-means begin with clusters: 15\n",
      "K-means end with clusters: 15\n",
      "v_measure_score: 0.3154110645365452\n",
      "calinski_harabaz_score: 18.92096868202975\n",
      "silhouette_score: 0.013268569323333613\n",
      "K-means begin with clusters: 20\n",
      "K-means end with clusters: 20\n",
      "v_measure_score: 0.33737042051954347\n",
      "calinski_harabaz_score: 15.883327882748215\n",
      "silhouette_score: 0.010195707943571245\n",
      "K-means begin with clusters: 25\n",
      "K-means end with clusters: 25\n",
      "v_measure_score: 0.36227956006872886\n",
      "calinski_harabaz_score: 14.154536010934704\n",
      "silhouette_score: 0.012280054626738588\n",
      "K-means begin with clusters: 30\n",
      "K-means end with clusters: 30\n",
      "v_measure_score: 0.3394074179353723\n",
      "calinski_harabaz_score: 12.629497987431437\n",
      "silhouette_score: 0.011737333520723018\n",
      "K-means begin with clusters: 35\n",
      "K-means end with clusters: 35\n",
      "v_measure_score: 0.3662884050021392\n",
      "calinski_harabaz_score: 11.540451891852179\n",
      "silhouette_score: 0.013341373150456845\n",
      "K-means begin with clusters: 40\n",
      "K-means end with clusters: 40\n",
      "v_measure_score: 0.3405146414237767\n",
      "calinski_harabaz_score: 10.804937211891803\n",
      "silhouette_score: 0.012256691622328739\n",
      "K-means begin with clusters: 45\n",
      "K-means end with clusters: 45\n",
      "v_measure_score: 0.3437283169812097\n",
      "calinski_harabaz_score: 10.108966390401166\n",
      "silhouette_score: 0.014424737022267715\n",
      "K-means begin with clusters: 50\n",
      "K-means end with clusters: 50\n",
      "v_measure_score: 0.3438601775727036\n",
      "calinski_harabaz_score: 9.624289206746697\n",
      "silhouette_score: 0.015208839619653419\n"
     ]
    }
   ],
   "source": [
    "from sklearn import metrics\n",
    "from sklearn.cluster import KMeans\n",
    "\n",
    "def K_cluster_analysis(Ks, X):\n",
    "    SC_scores = []\n",
    "    CH_scores = []\n",
    "    VM_scores = []\n",
    "    for K in Ks:\n",
    "        print(\"K-means begin with clusters: {}\".format(K))\n",
    "        y_pred = KMeans(n_clusters=K, n_jobs=-1).fit_predict(X)\n",
    "        print(\"K-means end with clusters: {}\".format(K))\n",
    "        \n",
    "        vm = metrics.v_measure_score(labels_true, y_pred) #本案例中训练数据有标签，可采用有参考模型的评价指标\n",
    "        print(\"v_measure_score: {}\".format(vm))\n",
    "        \n",
    "        ch = metrics.calinski_harabaz_score(X, y_pred) #这两个分数值越大则聚类效果越好\n",
    "        print(\"calinski_harabaz_score: {}\".format(ch))\n",
    "        \n",
    "        sh = metrics.silhouette_score(X, y_pred) #轮廓系数Silhouette Coefficient在大样本时计算太慢\n",
    "        print(\"silhouette_score: {}\".format(sh))\n",
    "        \n",
    "        CH_scores.append(ch)\n",
    "        SC_scores.append(sh)\n",
    "        VM_scores.append(vm)\n",
    "    return CH_scores,SC_scores,VM_scores\n",
    "\n",
    "Ks = [5,10,15,20,25,30,35,40,45,50]\n",
    "CH_scores,SC_scores,VM_scores=K_cluster_analysis(Ks,tfidf.toarray())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [],
   "source": [
    "#去量纲\n",
    "\n",
    "ch = [float(x - np.min(CH_scores))/(np.max(CH_scores)- np.min(CH_scores)) for x in CH_scores]\n",
    "sc = [float(x - np.min(SC_scores))/(np.max(SC_scores)- np.min(SC_scores)) for x in SC_scores]\n",
    "vm = [float(x - np.min(VM_scores))/(np.max(VM_scores)- np.min(VM_scores)) for x in VM_scores]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "CH_Best_K: 5\n",
      "SC_Best_K: 50\n",
      "VM_Best_K: 35\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 绘制不同K对应的聚类的性能，找到最佳模型／参数（分数最高）\n",
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "%matplotlib inline\n",
    "\n",
    "plt.plot(Ks, np.array(ch), 'r-', label = 'CH_scores')\n",
    "plt.plot(Ks, np.array(sc), 'g-', label = 'SC_scores')\n",
    "plt.plot(Ks, np.array(vm), 'b-', label = 'VM_scores')\n",
    "plt.legend(loc='best')\n",
    "plt.xlabel( 'Calinski-Harabasz Index & Silhouette Coefficient & V Measure' )                                                                                    \n",
    "plt.ylabel( 'score' )\n",
    "\n",
    "### 最佳超参数\n",
    "index = np.unravel_index(np.argmax(CH_scores, axis=None), len(CH_scores))\n",
    "Best_K = Ks[index[0]]\n",
    "print('CH_Best_K:',Best_K)\n",
    "\n",
    "index = np.unravel_index(np.argmax(SC_scores, axis=None), len(SC_scores))\n",
    "Best_K = Ks[index[0]]\n",
    "print('SC_Best_K:',Best_K)\n",
    "\n",
    "index = np.unravel_index(np.argmax(VM_scores, axis=None), len(VM_scores))\n",
    "Best_K = Ks[index[0]]\n",
    "print('VM_Best_K:',Best_K)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "这里：\n",
    "calinski_harabaz_score随着K的增加而递减，最佳k值是5；\n",
    "silhouette_score随着K的增加而抖动增加，最佳k值是50；\n",
    "v_measure_score随着K的增加而抖动增加，最佳k值是35"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "我认为原数据只有11类，我们也应该聚成11类，而上图可知，K=11时，几个指标均较稳定在较高处，所以确定K=11"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(4773, 30731)"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "K=cluster_num #确定K=11\n",
    "data=tfidf.toarray()\n",
    "data.shape"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "文本特征有30731维，维度很高，所以训练很慢"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "K-means begin with clusters: 11\n",
      "K-means end with clusters: 11\n",
      "v_measure_score: 0.2880277193741205\n",
      "calinski_harabaz_score: 22.525889193944586\n",
      "silhouette_score: 0.012677927636318585\n"
     ]
    }
   ],
   "source": [
    "print(\"K-means begin with clusters: {}\".format(K))\n",
    "y_pred = KMeans(n_clusters=K, n_jobs=5).fit_predict(data)\n",
    "print(\"K-means end with clusters: {}\".format(K))\n",
    "        \n",
    "vm = metrics.v_measure_score(labels_true, y_pred) #本案例中训练数据有标签，可采用有参考模型的评价指标\n",
    "print(\"v_measure_score: {}\".format(vm))\n",
    "        \n",
    "ch = metrics.calinski_harabaz_score(data, y_pred) #这两个分数值越大则聚类效果越好\n",
    "print(\"calinski_harabaz_score: {}\".format(ch))\n",
    "        \n",
    "sh = metrics.silhouette_score(data, y_pred) #轮廓系数Silhouette Coefficient在大样本时计算太慢 \n",
    "print(\"silhouette_score: {}\".format(sh))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "总结：\n",
    "1）K-means不保证达到全局最优（收敛，但没有达到全局最优），如上测试结果可见，调参过程存在很大的评分抖动\n",
    "2）轮廓系数和CH索引不一定相关，如测试结果，silhouette最好时calinski_harabaz反而是最差的，很难找出让所有指标都最优都参数，所以训练时要明确任务需要关注的指标，以此指标为目标调优即可。"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.8"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
